Istio Gateway

개요

게이트웨이는 이스티오의 주요 리소스 중 하나로, 서비스 메시에 내외부들 드나드는 트래픽의 진입문을 설정 관리한다.
리소스로서의 게이트웨이를 알기 전에, north-south 트래픽을 처리하기 위해 실제로 배포하는 워크로드인 인그레스 게이트웨이, 이그레스 게이트웨이부터 봐야 한다.
리소스로서의 게이트웨이는 해당 워크로드를 관리하는 CRD에 불과하기 때문이다.

개념 정리

네트워크 토폴로지에서의 게이트웨이

게이트웨이는 말 그대로 어떤 네트워크의 진입 지점을 이야기한다.
가장 쉽게 이해할 수 있는 표현으로는 API 게이트웨이가 있겠다.
이스티오의 서비스 메시 환경에서 외부의 트래픽을 받거나 외부로 트래픽을 보내는 경로가 되는 지점을 게이트웨이라고 표현한다.
이스티오의 게이트웨이는 클러스터와 외부의 트래픽을 잇는 진입점으로서 기능한다.
외부 트래픽은 게이트웨이를 통해 들어오고, 이 게이트웨이에서는 트래픽의 정보를 확인한다.
그리고 클러스터 내부에 적절한 서비스로 트래픽을 전달해준다.
서비스의 응답 역시 이 게이트웨이를 통해서 나가게 된다.

이 게이트웨이에 대한 트래픽을 조금 세분화시키는 용어가 있는데, 이것이 바로 인그레스(ingress), 이그레스(egress)이다.
잘 정의된 게이트웨이로 들어오는 트래픽을 인그레스가 부르며, 보통 이 트래픽에 대한 응답이 돌아가는 과정까지 총칭한다.
(나가는 트래픽까지 포함하여 부를 때 인바운드라고 표현하기도 한다.)
반대로 이그레스는 게이트웨이를 통해 클러스터 외부로 나가는 트래픽을 말한다.

인그레스란 표현은 쿠버네티스 네트워크를 공부할 때 인그레스 리소스로서 익숙할 것이다.
쿠버 리소스로서 인그레스 역시, HTTP관련 클러스터로 들어온 트래픽을 처리하는 진입점에 대한 설정을 하기에 그런 이름으로 명명된 것이다.

가상 IP, 가상 호스트

그렇다면 게이트웨이로 요청을 보내려면 어떻게 해야하고, 게이트웨이는 어떻게 트래픽을 적절한 서비스로 전달하는가?
여기에서 쓰이는 개념이 가상 IP, 가상 호스트이다.

사실 별 건 아니고, 게이트웨이가 가지는 IP를 가상 IP라고 부르고, 게이트웨이가 처리하는 호스트 이름을 가상 호스트라고 부른다.
왜 가상이라 부르는가?

이건 클러스터 외부의 클라이언트 입장에서 IP와 호스트를 봤을 때 가상이라 그런 것이다.
클라이언트가 통신하고자 하는 대상은 사실 게이트웨이 뒷단의 서비스인데, 요청을 보내기 위해서는 게이트웨이를 거쳐야 한다.
그래서 클라이언트는 게이트웨이의 주소로 요청을 보내게 되는데, 이것은 실제 서비스의 주소는 아니기에 가상 IP라고 부른다.
호스트 역시 마찬가지다.
게이트웨이는 들어온 요청의 호스트 헤더에 따라 트래픽을 어떻게 처리할지 결정한다.
물론 클러스터 내에서 뒷단의 서비스를 매칭하기 위해 각각이 호스트를 가지고 있을 것이고, 이 호스트가 클라가 요청한 호스트와도 일치하긴 할 것이다.
그러나 클라가 결국 호스트랍시고 요청한 대상은 게이트웨이이며, 게이트웨이가 해당 호스트인 마냥 처리한다.

결국 외부 클라의 요청의 정보들은 실제 서비스를 나타내고 있지 않음에도 게이트웨이가 요청을 받고, 처리하기 위해 쓰인다.
이러한 면에서 기본적인 IP와 호스트의 의미가 변질되어 일종의 추상화가 이뤄진다고 볼 수 있다.
그래서 게이트웨이가 처리하는 IP와 호스트를 아울러 가상 IP, 가상 호스트라고 표현하는 것이다.

그냥 개념적인 차원의 내용이긴 한데, 가상 호스트는 보통 뒷단에 어떤 서비스로 트래픽을 보낼지 정하는데 쓰인다.
그래서 이스티오를 설정할 때도 많이 등장하는 개념이라 알아두면 좋다.

인그레스 게이트웨이, 이그레스 게이트웨이

그럼 실제 게이트웨이는 쿠버네티스 클러스터에서 어떤 식으로 구현되는가?
간단하게, NodePort를 가진 서비스로 클러스터 외부에서 트래픽이 접근 가능하게 하고, 이 서비스의 백엔드로 프록시 서버를 두면 된다!
이스티오에서는 설정에 따라 이런 워크로드를 자동으로 배포해주는데, 이 워크로드를 인그레스, 이그레스 게이트웨이라고 부른다.
해당 게이트웨이 역할을 하는 워크로드 역시 하나의 프록시로, 엔보이가 배포된다.

리소스로서의 게이트웨이

이스티오 클러스터에서 게이트웨이의 실제 구현체는 엔보이 프록시를 담은 하나의 워크로드라는 것이 이제야 명확해진다.
그럼 이 게이트웨이에 여러 설정을 집어 넣으려면 어떻게 해야 하는가?
게이트웨이 구현체에 설정을 가하기 위해 이스티오에서는 Gateway라는 리소스를 정의해뒀다.
이를 통해 서비스 메시 클러스터에서 통합적으로 게이트웨이에 대한 관리를 할 수 있게 되는 것이다!
Gateway에 대한 리소스를 만들면 이스티오 컨트롤 플레인은 이를 해석하여 실제 게이트웨이 구현체에 설정을 반영한다.

여기에서 참고해야 하는 것이, Gateway 리소스를 만드는 것 자체는 실제 게이트웨이 구현체를 만드는 것과 별개이다.
이스티오의 Gateway 리소스는 이미 존재하는 게이트웨이 워크로드에 대해 설정을 하는 리소스이며, 워크로드 자체는 직접 배포해야만 한다.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: default
  components:
    ingressGateways:
    - name: istio-ingressgateway
      enabled: true

직접 배포해야 한다고 해서 어렵지는 않은 게, 이스티오 설치 및 관리를 하는 양식 파일에 이런 식으로 컴포넌트를 작성해두면 이스티오 컨트롤 플레인에서 알아서 해당 워크로드를 배포해준다.

직접 게이트웨이 워크로드를 만들고 싶다면

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-user-gateway-injected
spec:
  selector:
    matchLabels:
      ingress: my-user-gateway-injected
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "true"
        inject.istio.io/templates: gateway
      labels:
        ingress: my-user-gateway-injected
    spec:
      containers:
        - name: istio-proxy
          image: auto

이런 식으로 어노테이션을 세팅해서 게이트웨이를 배포하는 것도 가능하다.
이때 컨테이너 이름과 이미지는 저걸로 무조건 고정해야 한다.

이 방식은 게이트웨이API의 Gateway 리소스와 큰 차이점을 지닌다.
게웨api에서는 Gateway 리소스를 만들 시 해당 워크로드까지 같이 배포가 진행된다.
반면 이스티오의 Gateway 리소스는 먼저 외부 진입점으로서의 게이트웨이 워크로드가 있는 상태에서 게이트웨이 리소스를 만들어서 이를 추적 관리한다.

이그레스 게이트웨이에 대해 - ServiceEntry

여태 설명은 전부 인그레스에 대해 이야기했기에, 인그레스 게이트웨이를 배치하는 것은 상당히 자연스럽게 느껴진다.
그런데 이그레스의 경우는 어떨까?
이스티오에서는 모든 네트워크 트래픽이 프록시를 경유하기에 클러스터 외부로 나가는 트래픽에 대해서도 이 프록시 설정에 따라 동작하게 된다.

  meshConfig:
    outboundTrafficPolicy:
      mode: ALLOW_ANY

이스티오 설정 파일에서 이런 식으로 설정하면 프록시는 클러스터가 아닌 주소로 향하는 모든 트래픽을 허용해준다(기본값).
이걸 막고 싶다면 mode: REGISTRY_ONLY로 세팅하면 된다.
이렇게 막은 상황에서는 이스티오 외부로 나가는 트래픽은 반드시 이그레스 게이트웨이를 거쳐야만 한다.

이그레스에 대해서는 조금의 설정이 더 필요한데, 어떤 주소가 클러스터 외부에 해당하는 것인지를 명시해야 하기 때문이다.
서비스 메시에서 각 프록시는 서비스 레지스트리를 통해 자신이 요청을 보낼 주소를 알아낸다.
그래서 외부의 주소를 서비스 레지스트리에 등록한 후에, 비로소 이그레스 게이트웨이를 경유해 트래픽이 나가도록 할 수 있다.
이때 사용되는 리소스가 바로 Istio ServiceEntry인데, 설정법은 문서 참고.

양식 작성법

이제 이스티오 게이트웨이 양식을 어떻게 쓰는지 알아본다.

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: some-config-namespace
spec:
  selector:
    app: my-gateway-controller
  servers:
  # https로 리다이렉트하며, 두 호스트 처리
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      httpsRedirect: true
  # https 트래픽 처리
  - port:
      number: 443
      name: https-443
      protocol: HTTPS
    hosts:
    - uk.bookinfo.com
    - eu.bookinfo.com
    tls:
      mode: SIMPLE # tls 터미네이션 수행
      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem
  # 네임스페이스 제한
  - port:
      number: 9443
      name: https-9443
      protocol: HTTPS
    hosts:
    - "bookinfo-namespace/*.bookinfo.com"
    tls:
      mode: SIMPLE
      credentialName: bookinfo-secret # 쿠버 시크릿로부터
  # 몽고 db 트래픽 처리
  - port:
      number: 2379
      name: mongo
      protocol: MONGO
    hosts:
    - "*"

기본적으로는 먼저 어떤 로드밸런서의 데이터를 처리할지 라벨 셀렉터 방식으로 지정한다.[1]

servers

그 다음 servers 필드를 통해 게이트웨이에 대한 서비스 메시 내 설정들을 할 수 있다.
여기에서 사용될 수 있는 필드는 다음과 같이 정리할 수 있다.

servers.tls

    tls:
      mode: SIMPLE
      credentialName: bookinfo-secret

여기에서 tls 연결 모드를 지정할 수 있다.
모드의 종류는 다음과 같다.

SIMPLE, PASSTHROUGH, MUTUAL 정도가 기본이다.
게이트웨이에서 TLS 터미네이션을 하기 위해서는 기본적으로 서비스단의 인증서가 필요하다.

      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem
---
      credentialName: bookinfo-secret

위와 같이 경로로 제공하거나, 쿠버네티스의 시크릿 리소스를 명시해주면 된다.

    tls:
      httpsRedirect: true

http 포트에서 https로 301 리다이렉트할 때는 이렇게 넣어준다.

관련 문서

이름 noteType created
25.05 테크니컬 라이팅 area 2025-05-07
Envoy knowledge 2025-04-07
Istio Telemetry knowledge 2025-04-08
Istio Gateway knowledge 2025-04-16
Istio ServiceEntry knowledge 2025-04-17
Istio VirtualService knowledge 2025-04-21
Istio DestinationRule knowledge 2025-04-21
Istio EnvoyFilter knowledge 2025-04-21
Istio WasmPlugin knowledge 2025-04-21
아르고 롤아웃과 이스티오 연계 knowledge 2025-04-22
pilot-agent knowledge 2025-04-28
Kiali knowledge 2025-04-28
Istio PeerAuthentication knowledge 2025-05-04
Istio RequestAuthentication knowledge 2025-05-04
Istio AuthorizationPolicy knowledge 2025-05-04
Istio Operator knowledge 2025-05-09
istioctl knowledge 2025-05-12
Istio Sidecar knowledge 2025-05-13
Istio ProxyConfig knowledge 2025-05-17
istiod knowledge 2025-05-18
사이드카 모드 knowledge 2025-05-18
메시 배포 모델 knowledge 2025-05-21
Istio WorkloadGroup knowledge 2025-05-26
Istio WorkloadEntry knowledge 2025-05-26
앰비언트 모드 knowledge 2025-06-02
책 내용 정리 project 2025-04-03
스터디 내용 사전 정리 project 2025-04-03
1주차 - istio 소개, 첫걸음 project 2025-04-06
2주차 - 엔보이, 게이트웨이 project 2025-04-13
3주차 - 트래픽 관리 project 2025-04-19
3주차 - 네트워크 복원력 project 2025-04-23
4주차 - 이스티오 관측가능성 project 2025-04-27
5주차 - 통신 보안 project 2025-05-04
6주차 - 디버깅 project 2025-05-11
7주차 - 스케일링, 멀티 클러스터 project 2025-05-18
1W - 서비스 메시와 이스티오 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 published 2025-04-10
1W - Gateway API를 활용한 설정 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 published 2025-04-10
2W - 인그레스 게이트웨이 실습 published 2025-04-17
2W - 엔보이 published 2025-04-19
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 published 2025-04-26
4W - 이스티오 메트릭 확인 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE published 2025-05-11
5W - 이스티오 JWT 인증 published 2025-05-11
5W - 이스티오 인가 정책 설정 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 published 2025-05-18
8W - 가상머신 통합하기 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 published 2025-06-07
7W - 이스티오 메시 스케일링 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 published 2025-06-09
이스티오 스케일링 topic 2025-05-18
엔보이에 와즘 플러그인 적용해보기 topic 2025-06-09
E-이스티오 설정 트러블슈팅하기 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 성능 최적화 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 메트릭 topic/explain 2025-05-18
E-이스티오의 데이터 플레인 트래픽 세팅 원리 topic/explain 2025-05-27
E-deb 파일 뜯어보기 topic/explain 2025-06-01
E-이스티오 DNS 프록시 동작 topic/explain 2025-06-01
E-이스티오 가상머신 통합 topic/explain 2025-06-01
E-이스티오에서 엔보이 기능 확장하기 topic/explain 2025-06-01
E-앰비언트 모드 헬름 세팅 topic/explain 2025-06-03
E-앰비언트 ztunnel 트래픽 경로 분석 topic/explain 2025-06-07
E-앰비언트 모드에서 메시 기능 활용 topic/explain 2025-06-07
E-이스티오 메시 스케일링 topic/explain 2025-06-08
E-istio-csr 사용 실습 topic/explain 2025-06-09
I-다른 네임스페이스 같은 포트 리스닝 서버 구현 topic/idea 2025-06-07
I-ztunnel이 다른 네임스페이스에서 요청 보내는 코드 분석 topic/idea 2025-06-07
T-엔보이 실습 with solo.io topic/temp 2025-04-14

참고


  1. https://istio.io/latest/docs/reference/config/networking/gateway/ ↩︎